import http from "@/utils/http";
import OSS from "ali-oss";
import axios from "axios";

//get alioss sts
export function getAliOSSPolicyToken(params) {
    return new Promise(async (resolve, reject) => {
        http.post({
            url: "/ali-oss/sts",
            params: params,
            success: (res) => {
                resolve(res.data)
            },
            failure: (err) => {
                reject(err)
            }
        })
    });
}

// upload file
export function upFileToOSS(file, metaData) {

    return new Promise((resolve, reject) => {
        getAliOSSPolicyToken(metaData)
            .then((res) => {
                const client = new OSS({
                    // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
                    region: res.region,
                    // 从STS服务获取的临时访问密钥（AccessKey ID和AccessKey Secret）。
                    accessKeyId: res.AccessKeyId,
                    accessKeySecret: res.AccessKeySecret,
                    // 从STS服务获取的安全令牌（SecurityToken）。
                    stsToken: res.SecurityToken,
                    // 填写Bucket名称。
                    bucket: res.bucket,
                    refreshSTSToken: async () => {
                        const refreshToken = await axios.get("/ali-oss/sts");
                        return {
                            accessKeyId: refreshToken.AccessKeyId,
                            accessKeySecret: refreshToken.AccessKeySecret,
                            stsToken: refreshToken.SecurityToken,
                        };
                    },
                });

                const options = {
                    headers: {
                        'x-oss-object-acl': 'private', //私有资源，不能互联网免密访问
                        'x-oss-security-token': res.SecurityToken,//私有资源，不能互联网免密访问
                    }
                }

                let fileID = res.fileDir + '/' + res.fileId
                // fileID表示上传到OSS的文件名称。
                // fileInfo表示浏览器中需要上传的文件，支持HTML5 file和Blob类型。
                client.put(fileID, file, options).then(function (result) {
                    console.log('put success: %j', result);
                    resolve(result)
                }).catch(function (err) {
                    console.error('error: %j', err);
                    reject({
                        status: 0,
                        message: 'err',
                    });
                });

            })
            .catch((err) => {
                reject({
                    status: 0,
                    message: 'err',
                });
            });
    });
}

// download file
export function downloadFileFromOSS(metaData) {
    return new Promise((resolve, reject) => {
        getAliOSSPolicyToken(metaData).then((res) => {
            const filename = metaData.fileName; // 自定义下载后的文件名称。
            const response = {
                "content-disposition": `attachment; filename=${encodeURIComponent(filename)}`,
            };
            const client = new OSS({
                region: 'oss-cn-shenzhen',
                accessKeyId: res.AccessKeyId,
                accessKeySecret: res.AccessKeySecret,
                stsToken: res.SecurityToken,
                bucket: res.bucket,
                refreshSTSToken: async () => {
                    const refreshToken = await axios.get("/ali-oss/sts");
                    return {
                        accessKeyId: refreshToken.AccessKeyId,
                        accessKeySecret: refreshToken.AccessKeySecret,
                        stsToken: refreshToken.SecurityToken,
                    };
                },
            });
            const url = client.signatureUrl(filename, {
                // 设置过期时间为3600s。
                expires: 3600,
                response,
            });
            resolve({
                status: "0000",
                message: "成功",
                data: {
                    url: url
                }
            })
        }).catch(error => {
            console.log("error", error)
            reject({
                status: "0010",
                message: "访问凭证获取失败"
            })
        })
    })

}

// 阿里云列举
export const getAliOssList = async ({
    params = Object,
}) => {
    const client = new OSS({
        // yourregion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
        region: 'oss-cn-shenzhen',
        // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        accessKeyId: "LTAI5tPhhuzp4p4SCq1L4c6u",
        accessKeySecret: "HIhKIcPQ8Y9biTkpUKti7wsRHjZTiq",
        // yourbucketname填写存储空间名称。
        bucket: 'bigkel-com'
    });
    let result = await client.listV2(params);
    const { objects, prefixes } = result;
    return { objects, prefixes, result }
}